有時,你可能需要在你的 Yii 應用程式中使用一些第三方代碼。或者你可能想要在某些第三方系統中將 Yii 用作函式庫。在本節中,我們將展示如何實現這些目標。
要在 Yii 應用程式中使用第三方函式庫,你主要需要確保函式庫中的類別已正確包含或可以自動載入。
許多第三方函式庫以 Composer 套件的形式發布。你可以通過以下兩個簡單步驟安裝這些函式庫
composer.json
檔案,並指定要安裝的 Composer 套件。composer install
以安裝指定的套件。已安裝的 Composer 套件中的類別可以使用 Composer 自動載入器自動載入。確保應用程式的 進入腳本 包含以下行以安裝 Composer 自動載入器
// install Composer autoloader
require __DIR__ . '/../vendor/autoload.php';
// include Yii class file
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
如果函式庫未以 Composer 套件形式發布,則應按照其安裝說明進行安裝。在大多數情況下,你需要手動下載發布檔案並將其解壓縮到 BasePath/vendor
目錄中,其中 BasePath
代表應用程式的 基礎路徑。
如果函式庫攜帶自己的類別自動載入器,你可以在應用程式的 進入腳本 中安裝它。建議在包含 Yii.php
檔案之前完成安裝,以便 Yii 類別自動載入器可以在自動載入類別時優先。
如果函式庫未提供類別自動載入器,但其類別命名遵循 PSR-4,你可以使用 Yii 類別自動載入器來自動載入類別。你只需為其類別中使用的每個根命名空間聲明一個 根別名。例如,假設你已將函式庫安裝在 vendor/foo/bar
目錄中,並且函式庫類別位於 xyz
根命名空間下。你可以在應用程式配置中包含以下代碼
[
'aliases' => [
'@xyz' => '@vendor/foo/bar',
],
]
如果以上兩種情況都不是,則函式庫可能依賴 PHP 包含路徑配置來正確定位和包含類別檔案。只需按照其關於如何配置 PHP 包含路徑的說明進行操作。
在最壞的情況下,當函式庫需要顯式包含每個類別檔案時,你可以使用以下方法按需包含類別
Yii::$classMap
中列出類別和相應的檔案路徑。例如,Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';
由於 Yii 提供了許多出色的功能,有時你可能希望使用其某些功能來支持開發或增強第三方系統,例如 WordPress、Joomla 或使用其他 PHP 框架開發的應用程式。例如,你可能想要在第三方系統中使用 yii\helpers\ArrayHelper 類別或使用 Active Record 功能。為了實現此目標,你主要需要執行兩個步驟:安裝 Yii 和啟動引導 Yii。
如果第三方系統使用 Composer 來管理其依賴項,請運行以下命令將 Yii 添加到專案需求中
composer require yiisoft/yii2
如果你只想使用 Yii 的資料庫抽象層或其他與資源無關的功能,則應要求一個特殊的 Composer 套件,以防止安裝 Bower 和 NPM 套件。請參閱 cebe/assetfree-yii2 以獲取詳細信息。
另請參閱關於 通過 Composer 安裝 Yii 的一般章節,以獲取有關 Composer 的更多信息以及安裝期間可能出現的問題的解決方案。
否則,你可以 下載 Yii 發布檔案並將其解壓縮到 BasePath/vendor
目錄中。
接下來,你應該通過在開頭包含以下代碼來修改第三方系統的進入腳本
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$yiiConfig = require __DIR__ . '/../config/yii/web.php';
new yii\web\Application($yiiConfig); // Do NOT call run() here
如你所見,上面的代碼與典型 Yii 應用程式的 進入腳本 中的代碼非常相似。唯一的區別是在創建應用程式實例後,run()
方法未被調用。這是因為通過調用 run()
,Yii 將接管請求處理工作流程的控制權,這在本例中是不需要的,並且已由現有應用程式處理。
就像在 Yii 應用程式中一樣,你應該根據運行第三方系統的環境配置應用程式實例。例如,要使用 Active Record 功能,你需要使用第三方系統使用的 DB 連接設定來配置 db
應用程式組件。
現在你可以使用 Yii 提供的大多數功能。例如,你可以創建 Active Record 類別並使用它們來操作資料庫。
如果你之前使用過 Yii 1,則很可能你有一個正在運行的 Yii 1 應用程式。你可能只想使用 Yii 2 中才有的某些功能來增強它,而不是在 Yii 2 中重寫整個應用程式。這可以通過以下描述的方式實現。
注意:Yii 2 需要 PHP 5.4 或更高版本。你應該確保你的伺服器和現有應用程式都支持這一點。
首先,按照上一小節中給出的說明,在現有應用程式中安裝 Yii 2。
其次,按如下所示修改應用程式的進入腳本,
// include the customized Yii class described below
require __DIR__ . '/../components/Yii.php';
// configuration for Yii 2 application
$yii2Config = require __DIR__ . '/../config/yii2/web.php';
new yii\web\Application($yii2Config); // Do NOT call run(), yii2 app is only used as service locator
// configuration for Yii 1 application
$yii1Config = require __DIR__ . '/../config/yii1/main.php';
Yii::createWebApplication($yii1Config)->run();
由於 Yii 1 和 Yii 2 都有 Yii
類別,因此你應該創建一個自定義版本來組合它們。上面的代碼包含自定義的 Yii
類別檔案,可以按如下方式創建。
$yii2path = '/path/to/yii2';
require $yii2path . '/BaseYii.php'; // Yii 2.x
$yii1path = '/path/to/yii1';
require $yii1path . '/YiiBase.php'; // Yii 1.x
class Yii extends \yii\BaseYii
{
// copy-paste the code from YiiBase (1.x) here
}
spl_autoload_unregister(array('YiiBase','autoload'));
spl_autoload_register(array('Yii','autoload'));
Yii::$classMap = include($yii2path . '/classes.php');
// register Yii 2 autoloader via Yii 1
Yii::registerAutoloader(['yii\BaseYii', 'autoload']);
// create the dependency injection container
Yii::$container = new yii\di\Container;
就是這樣!現在在你代碼的任何部分,你可以使用 Yii::$app
訪問 Yii 2 應用程式實例,而 Yii::app()
將為你提供 Yii 1 應用程式實例
echo get_class(Yii::app()); // outputs 'CWebApplication'
echo get_class(Yii::$app); // outputs 'yii\web\Application'
發現錯字或你認為此頁面需要改進?
在 github 上編輯 !
註冊 或 登入 以便發表評論。